3. Обработка сигнала USR1

20-09-2026 2 min

Чаще всего виджет показывается при нажатии горячих клавиш или кнопки в баре на подобии waybar. Один из способов скрывать/показывать виджет, это отправлять ему Posix сигнал, например так:

pkill -USR1 -f hypr_calendar_widget

Реализуем обработку сигнала USR1:

Добавим статическую переменную в Application.vala для хранения в ней окна виджета

private static HyprCalendar.MainWindow _window;

в методе activate заменим локальную переменную window на статическую _window

public override void activate() {
    _window = new MainWindow(this);
    GtkLayerShell.init_for_window(_window);
    GtkLayerShell.set_layer(_window, GtkLayerShell.Layer.TOP);
    GtkLayerShell.set_namespace(_window, "HyprCalendar");
    GtkLayerShell.set_anchor(
        _window,
        GtkLayerShell.Edge.TOP,
        true
    );
    _window.present();
}

добавим статический метод change_visibility

private static void change_visibility(){
    if(_window != null){
        _window.set_visible(!_window.get_visible());
    }
}

в функции main добавим вызов метода change_visibility при получении Posix сигнала USR1

public static int main() {
    var application = new HyprCalendar.Application();
    Posix.signal(Posix.Signal.USR1, change_visibility);
    return application.run();
}

полный листинг Application.vala:

using GLib;
using Gtk;
using GtkLayerShell;

public class HyprCalendar.Application: Gtk.Application {
    private static HyprCalendar.MainWindow _window;

    public Application() {
        Object(application_id: "com.github.HyprCalendar");
    }

    public override void activate() {
        _window = new MainWindow(this);
        GtkLayerShell.init_for_window(_window);
        GtkLayerShell.set_layer(_window, GtkLayerShell.Layer.TOP);
        GtkLayerShell.set_namespace(_window, "HyprCalendar");
        GtkLayerShell.set_anchor(
            _window,
            GtkLayerShell.Edge.TOP,
            true
        );
        _window.present();
    }

    public static int main() {
        var application = new HyprCalendar.Application();
        Posix.signal(Posix.Signal.USR1, change_visibility);
        return application.run();
    }

    private static void change_visibility(){
        if(_window != null){
            _window.set_visible(!_window.get_visible());
        }
    }
}

Соберём проект

ninja -C build

запустим проект

./build/hypr_calendar_widget

откроем ещё одну вкладку в консоли или ещё одну консоль, кому как удобнее и в ней отправим сигнал нашему виджету:

pkill -USR1 -f hypr_calendar_widget

окно скроется. При повторной отправке сигнала окно снова появится.

Скрытый по умолчанию виджет

Есть виджеты которые при запуске не показываются сразу, а ждут сигнал. Для того чтобы это сделать нам нужно добавить в метод activate сокрытие окна _window.set_visible(false);

public override void activate() {
    _window = new MainWindow(this);
    GtkLayerShell.init_for_window(_window);
    GtkLayerShell.set_layer(_window, GtkLayerShell.Layer.TOP);
    GtkLayerShell.set_namespace(_window, "HyprCalendar");
    GtkLayerShell.set_anchor(
        _window,
        GtkLayerShell.Edge.TOP,
        true
    );
    _window.present();
    _window.set_visible(false);// скрываем окно после запуска
}

Соберём проект

ninja -C build

запустим проект

./build/hypr_calendar_widget

окно не покажется пока мы не отправим сигнал

pkill -USR1 -f hypr_calendar_widget